package file

import (
	"io/fs"
	"os"
	"path"
	"path/filepath"
	"strings"

	"device-admin/config"

	"192.168.1.75/go-pkg/errorx"
)

// FileExists 判断文件是否存在
func FileExists(fileURL string) bool {
	_, err := os.Stat(fileURL)
	return err == nil
}

// SaveFile 保存文件
// dirPrefix 前缀路径，fileName 文件后缀，fileExt 文件扩展名,content文件内容
func CreateMapFile(root, dirPrefix string, fileName string, fileExt string, content []byte) error {
	fullDir := path.Join(root, "device-map", dirPrefix)
	err := os.MkdirAll(fullDir, 0o755)
	if err != nil {
		return err
	}
	f, err := os.Create(fullDir + "/" + fileName + fileExt)
	if err != nil {
		return err
	}
	_, err = f.Write(content)
	if err != nil {
		return err
	}
	f.Close()
	return nil
}

// ReadFile 读取文件
func ReadMapFile(root, file string) ([]byte, error) {
	filePath := path.Join(config.Config.FileSaveDir, "device-map", file)
	_, err := os.Stat(filePath)
	if err != nil {
		return nil, errorx.New("不存在", -1)
	}
	return os.ReadFile(filePath)
}

// GetRobotAllMapFileName 获取所有设备的地图文件
// fileExt 文件扩展类型
func GetRobotAllMapFileName(root, robotID string, fileExt string) []string {
	var names []string
	filepath.Walk(path.Join(root, "device-map", robotID), func(path string, info fs.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if !info.IsDir() {
			filenameArr := strings.Split(info.Name(), ".")
			if len(filenameArr) == 2 && filenameArr[1] == fileExt {
				names = append(names, filenameArr[0])
			}
		}
		return nil
	})
	return names
}

// DeleteMapFile 删除地图文件
// robotID 设备id, filename 文件名称 , fileExt 文件扩展
func DeleteMapFile(root, robotID string, fileName string, fileExt string) {
	os.Remove(path.Join(root, "device-map", robotID, fileName+"."+fileExt))
}

// SaveUploadFileTo 保存上传的文件到指定位置，防止过期清理
func SaveUploadFileTo(srcFile string, dstDir string) (string, error) {
	// 判断原始文件是否存在
	_, err := os.Stat(srcFile)
	if err != nil {
		return "", errorx.New("源文件不存在", -1)
	}
	// 判断路径否存在，不存在则创建
	_, err = os.Stat(dstDir)
	if err != nil {
		err = os.MkdirAll(dstDir, os.ModePerm)
		if err != nil {
			return "", errorx.New("创建目标文件夹失败", -1)
		}
	}
	// 将文件移动到指定目录
	err = os.Rename(srcFile, path.Join(dstDir, filepath.Base(srcFile)))
	if err != nil {
		return "", errorx.New("文件移动失败", -1)
	}
	return path.Join(dstDir, filepath.Base(srcFile)), nil
}
